package com.itheima.d6_object_stream;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 目标：掌握对象字节输出流的使用：序列化对象。
 *      对象序列化：把Java对象写入到文件中去
 *      对象反序列化：把文件里的Java对象读出来
 *
 *IO流的体系
 *   字节流：          抽象类          实现类(原始流/低级流)     实现类(包装流/处理流)
 *     字节输入流    InputStream      FileInputStream  字节缓冲输入流:BufferedInputStream                        数据输入流：DataInputStream     对象字节输入流:ObjectInputStream
 *     字节输出流    OutputStream     FileOutputSteam  字节缓冲输出流:BufferedOutputStream  打印流：PrintStream   数据输出流：DataOutputStream    对象字节输出流:ObjectOutputStream
 *
 *   字符流：               实现类(原始流/低级流) 实现类(包装流/处理流)
 *     字符输入流    Reader  FileReader   字符缓冲输入流:BufferedReader    字符输入转换流：InputStreamReader
 *     字符输出流    Writer  FileWriter   字符缓冲输出流:BufferedWriter    字符输出转换流：OutputStreamWrite  打印流：PrintWriter
 *
 *
 *  ObjectOutputStream(对象字节输出流):
 *          可以把Java对象进行序列化：把Java对象存入到文件中去。
 *   构造器
 *   public ObjectOutputStream(OutputStream out)        创建对象字节输出流，包装基础的字节输出流
 *   方法
 *   public final void writeObject (Object o) throws IOException    把对象写出去
 * 注意：对象如果要参与序列化，必须实现序列化接口（java.io.Serializable）
 *
 *  ObjectInputStream(对象字节输入流):
 *          可以把Java对象进行反序列化：把存储在文件中的Java对象读入到内存中来。
 *   构造器
 *   public ObjectInputStream(InputStream is)           创建对象字节输入流，包装基础的字节输入流
 *   方法
 *   public final Object readObject ()                  把存储在文件中的Java对象读出来
 *
 *
 * 如果要一次序列化多个对象：
 *   用一个ArrayList集合存储多个对象，然后直接对集合进行序列化即可
 *
 *      注意：ArrayList集合已经实现了序列化接口！
 *  源码：public class ArrayList<E> extends AbstractList<E>
 *         implements List<E>, RandomAccess, Cloneable, java.io.Serializable
 *
 *      总结：
 *   对象序列化的含义是什么？怎么实现对象序列化？需要注意什么？
 * 把对象数据存入到文件中去。
 * 对象字节输出流ObjectOutputStram
 * public void writeObject(Object obj)
 * 对象必须实现序列化接口
 * 对象反序列化的含义是什么？怎么实现对象反序列化？
 * 把对象数据存入到文件中去。
 * 对象字节输入流ObjectInputStram
 * public Object readObject()
 *
 *     有些时候，对象里面的某些信息不想参与序列化，因为序列化后容易被人看到信息，反序列化也容易被人看到信息
 *     transient 这个成员变量将不参与序列化。
 */
public class Test1ObjectOutputStream {
    public static void main(String[] args) {
        try (
                // 2、创建一个对象字节输出流包装原始的字节 输出流。
                ObjectOutputStream oos =
                        new ObjectOutputStream(new FileOutputStream("Day09Io-App2/src/itheima11out.txt"));
                ){
            // 1、创建一个Java对象。
            User u = new User("admin", "张三", 32, "666888xyz");

            // 3、序列化对象到文件中去
            //注意：对象如果要参与序列化，必须实现序列化接口（java.io.Serializable）否则会报错：NotSerializableException(不是可序列化的异常 )
            //注意：存入进去的样子不是乱码，并且也不是为了给我们看的。是特殊的存法，方便下次读取出来
/*            oos.writeObject(u);
            System.out.println("序列化对象成功！！");*/

            System.out.println("---------用一个ArrayList集合存储多个对象，然后对集合进行序列化达到一次性序列化多个对象的目的----------");
            List<User> userArrayList = new ArrayList<>();
            userArrayList.add(new User("zeng","ji",25,"123456"));
            userArrayList.add(new User("zeng","ji",26,"123456"));
            userArrayList.add(new User("zeng","ji",27,"123456"));
            oos.writeObject(userArrayList);
            System.out.println("----序列化user对象集合成功---------");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
